1.继承概述
   如果事物与事物之间有所属关系,我们就通过继承来描述这种所属关系
2.继承格式
 class A{

}
class B extends A{ //其中A是父类,B是子类

}
 当产生继承关系后,子类会自动继承父类的所有非私有成员
要想使用父类中的私有属性,我们必须在父类中定义相应的getter/setter方法
class  Father{
    //父类定义所有子类共有的属性和行为(成员变量和成员方法)
}
class Son extends Father{
    //子类中定义自身特有的属性和行为(成员变量和成员方法)
}
3.继承优点和注意事项
  a.优点:
    1.继承可以提高代码的复用性
    2.继承是多态的前提
  b.注意事项
    1.java只支持单继承不支持多继承
     class A{
      public void method() {
       System.out.println("A");
      }
     }
     class B{
      public void method() {
       System.out.println("B");
      }
     }
     class C extends A,B{ //假设C同时继承A和B
        //同时具有A的method和B的method方法
     }
     C c= new C();
     c.method();//无法确定到底是调用A中的还是B中method?
    2.java一个子类可以有多个父类 //一个父亲可以有多个儿子
     class A{

     }
     class B extends A{

     }
     class C extends A{

     }
   3.java可以有多层次(间接)继承
     class A{//爷爷
       //A的非私有属性和方法
     }
     class B extends A{//爸爸继承爷爷
        //B的非私有属性和方法
      //A的非私有属性和方法
     }
     class C extends B{//儿子继承爸爸
       //具有A类和B类中的非私有属性方法
     }
   4.java规定最顶层的父类是Object类(这个类是java定义好的)
     class A /*extends Object*/{

     }
4.继承中成员变量的访问特点
/**
 * 成员变量的访问特点:
 *    遵循就近原则:在访问成员变量的时候,如果本类有该成员变量,直接使用,如果没有,会继续查找父类
 *    局部=>子类(本类)=>父类=>父类的父类=>....=>Object//逐级查找,只要在其中一级找到就拿过来使用,如果所有层级都没有那么就报错
 *    通过this调用本类成员
 *    通过super调用父类成员
 */
5.继承中成员方法的访问特点
/**
 * 成员方法的访问特点:
 *    遵循就近原则:在访问成员方法的时候,如果本类有该成员方法,直接使用,如果没有,会继续查找父类
 *    子类(本类)=>父类=>父类的父类=>....=>Object//逐级查找,只要在其中一级找到就拿过来使用,如果所有层级都没有那么就报错
 *     * 即使成员方法重名,依然遵循就近原则
 *  * 可以通过super关键字来调用父类的成员方法
 */
6.重写的必要条件
 a.重写必须要有继承关系,重写针对的是子类的方法重写父类的方法
 b.子类的方法与被重写的父类的方法要保持一致(方法的定义:返回值类型,方法名,形参列表保持一致)
 c.子类的方法的权限 >= 父类被重写的方法的权限
   public  默认  protected   private
   最大的权限是public
   最小的权限是private
   private修饰的方法不被重写,private一旦修饰父类的方法,只能父类自己使用
   子类根本获取不到,也就无法重写
7.@Override,重载和重写的区别
/**
 * @Override强制子类的方法重写父类的方法,如果不重写就报错
 * 为了防止忘记重写
 * /*
 * * 重写和重载的区别:
 * *   重载:
 * *     public void show(int i){
 * *    }
 * *    public void show(double j){
 * *
 * *    }
 * *  重写:
 * *    public void method(double j){
 * *    }
 * *    public void method(double j){
 * *   }
 * *  a.权限修饰符:
 * *    重载:对修饰符没有要求
 * *    重写:子类的方法的权限>=被重写的父类的方法权限
 * *  b.返回值类型
 * *    重载:对返回值类型没有要求
 * *    重写:子类的方法的返回值类型和父类的方法的返回值类型保持一致
 * *  c.方法名
 * *    重载:重载的两个方法的方法名保持一致
 * *    重写:重写要求子类的方法名和被重写的父类的方法名保持一致
 * *  d.形参列表
 * *    重载:重载要求两个方法的形参列表不一致(形参的个数,形参的类型,形参的类型顺序 至少一个不一致就可以)
 * *    重写:重写要求子类的方法形参列表和父类的方法的形参列表保持一致
 * * */
8.抽象类&抽象方法
/**
 * 画一个形状,求出它的周长和面积
 * 长方形:
 *   求周长:2*(长+宽)
 *   求面积:长*宽
 * 正方形:
 *   求周长:4*边长
 *   求面积:边长*边长
 * 抽象方法引入:
 *    如果这个方法的方法体无法确定,我们需要把这个方法定义为抽象方法
 *    修饰符 abstract 返回值类型 方法名(形参列表);
 *  抽象类引入:
 *    一旦一个类含有抽象方法,那么这个类必须是抽象类
 *    抽象类无法创建对象,因为抽象类里面的抽象方法调用没有意义
 *  抽象类定义一般是作为体系的规范,约束子类必须实现父类的某些方法
 *  我们一般不直接使用抽象类而是通过创建它的子类对象去使用
 */
